home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 June / Software of the Month Club 1996 June.iso / pc / dos / dtp / display / drvsrc / vesa / vesa113.c < prev   
C/C++ Source or Header  |  1995-11-17  |  8KB  |  267 lines

  1. /**
  2.  ** VESADRV.C ---- EGA, VGA, VESA Super VGA driver for GRX 1.03
  3.  **
  4.  ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5.  ** Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6.  ** Copyright (C) 1993 Grzegorz Mazur, gbm@ii.pw.edu.pl
  7.  **
  8.  ** This file is distributed under the terms listed in the document
  9.  ** "copying.dj", available from DJ Delorie at the address above.
  10.  ** A copy of "copying.dj" should accompany this file; if not, a copy
  11.  ** should be available from where this file was obtained.  This file
  12.  ** may not be distributed without a verbatim copy of "copying.dj".
  13.  **
  14.  ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
  15.  ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16.  **/
  17. #pragma  inline
  18.  
  19. #include <stddef.h>
  20. #include <dos.h>
  21. #include "vdr.h"
  22.  
  23. char driver_name[] = {"GRX 1.03 VESA driver"};
  24.  
  25.  
  26. #define MAX_TEXT_MODES        20    /* maximum text mode table size */
  27. #define EGA_TEXT_START        6    /* start of the EGA mode table */
  28. #define EGA_TEXT_MODES        5    /* number of EGA text modes (incl end marker) */
  29. #define VESA_TEXT_START 4
  30.  
  31. GrModeEntry text_mode_table[MAX_TEXT_MODES] =
  32. {
  33.   {80, 25, 2, 0x007, SETUP_STANDARD},
  34.   {40, 25, 16, 0x001, SETUP_STANDARD},
  35.   {80, 25, 16, 0x003, SETUP_STANDARD},
  36.   {80, 50, 16, 0x003, SETUP_8X8_FNT},
  37.  
  38.   {132, 25, 16, 0x109, SETUP_STANDARD},
  39.   {132, 43, 16, 0x10a, SETUP_STANDARD},
  40.   {132, 50, 16, 0x10b, SETUP_STANDARD},
  41.   {132, 60, 16, 0x10c, SETUP_STANDARD},
  42.  
  43.   {0, 0, 0, UNSUP, 0}
  44. };
  45.  
  46.  
  47. #define MAX_GRAPH_MODES        40    /* maximum graphics mode table size */
  48. #define EGA_GRAPH_START        8    /* start of the EGA mode table */
  49. #define EGA_GRAPH_MODES        4    /* number of EGA graphics modes (incl end marker) */
  50. #define VESA_GRAPHIC_START 5
  51.  
  52. GrModeEntry graphics_mode_table[MAX_GRAPH_MODES] =
  53. {
  54.   {320, 200, 16, 0x00d, SETUP_STANDARD},
  55.   {640, 200, 16, 0x00e, SETUP_STANDARD},
  56.   {640, 350, 16, 0x010, SETUP_STANDARD},
  57.   {640, 480, 16, 0x012, SETUP_STANDARD},
  58.   {320, 200, 256, 0x013, SETUP_STANDARD},
  59.  
  60.   {640, 350, 256, 0x11c, SETUP_STANDARD},
  61.   {640, 400, 256, 0x100, SETUP_STANDARD},
  62.   {640, 480, 256, 0x101, SETUP_STANDARD},
  63.   {800, 600, 256, 0x103, SETUP_STANDARD},
  64.   {1024, 768, 256, 0x105, SETUP_STANDARD},
  65.   {1280, 1024, 256, 0x107, SETUP_STANDARD},
  66.  
  67.   {320, 200, 32768U, 0x10d, SETUP_STANDARD},
  68.   {640, 350, 32768U, 0x11d, SETUP_STANDARD},
  69.   {640, 400, 32768U, 0x11e, SETUP_STANDARD},
  70.   {640, 480, 32768U, 0x110, SETUP_STANDARD},
  71.   {800, 600, 32768U, 0x113, SETUP_STANDARD},
  72.   {1024, 768, 32768U, 0x116, SETUP_STANDARD},
  73.   {1280, 1024, 32768U, 0x119, SETUP_STANDARD},
  74.  
  75.   {320, 200, 0xc010U, 0x10e, SETUP_STANDARD},
  76.   {640, 350, 0xc010U, 0x11f, SETUP_STANDARD},
  77.   {640, 400, 0xc010U, 0x120, SETUP_STANDARD},
  78.   {640, 480, 0xc010U, 0x111, SETUP_STANDARD},
  79.   {800, 600, 0xc010U, 0x114, SETUP_STANDARD},
  80.   {1024, 768, 0xc010U, 0x117, SETUP_STANDARD},
  81.   {1280, 1024, 0xc010U, 0x11a, SETUP_STANDARD},
  82.  
  83.   {320, 200, 0xc018U, 0x10f, SETUP_STANDARD},
  84.   {640, 350, 0xc018U, 0x121, SETUP_STANDARD},
  85.   {640, 400, 0xc018U, 0x122, SETUP_STANDARD},
  86.   {640, 480, 0xc018U, 0x112, SETUP_STANDARD},
  87.   {800, 600, 0xc018U, 0x115, SETUP_STANDARD},
  88.   {1024, 768, 0xc018U, 0x118, SETUP_STANDARD},
  89.   {1280, 1024, 0xc018U, 0x11b, SETUP_STANDARD},
  90.  
  91.   {0, 0, 0, UNSUP, 0}
  92. };
  93.  
  94.  
  95. #include "pieces/vesainfo.c"
  96. #include "paging/vesa.c"
  97.  
  98. int do_driver_init(void)
  99. {
  100.   VgaInfoBlock *vb;
  101.   short far *modeptr;
  102.   int mode, table_mode, have_32_bit;
  103.   GrModeEntry *table;
  104.   ModeInfoBlock *mb;
  105.  
  106.   have_32_bit = 0;
  107.   HDR->memory_size = 0;
  108.   vb = VESAgetInfo();
  109.   if (vb == NULL) {
  110.     for (table = text_mode_table + VESA_TEXT_START; table->width > 0;
  111.          ++table)
  112.       table->mode.vdr.BIOS_mode = UNSUP;
  113.     for (table = graphics_mode_table + VESA_GRAPHIC_START; table->width > 0;
  114.          ++table)
  115.       table->mode.vdr.BIOS_mode = UNSUP;
  116.   }
  117.   else {
  118.     for (table = text_mode_table + VESA_TEXT_START; table->width > 0;
  119.          ++table) {
  120.       modeptr = vb->VideoModePtr;
  121.       table_mode = table->mode.vdr.BIOS_mode;
  122.       while ((mode = *modeptr++) != (-1)) {
  123.         if (table_mode == mode) break;
  124.       }
  125.       if (mode == (-1)) table->mode.vdr.BIOS_mode = UNSUP;
  126.     }
  127.     for (table = graphics_mode_table + VESA_GRAPHIC_START; table->width > 0;
  128.          ++table) {
  129.       modeptr = vb->VideoModePtr;
  130.       table_mode = table->mode.vdr.BIOS_mode;
  131.       while ((mode = *modeptr++) != (-1)) {
  132.         if (table_mode == mode) break;
  133.       }
  134.       if (mode == (-1)) table->mode.vdr.BIOS_mode = UNSUP;
  135.       else if (table->number_of_colors == 0xc018U) {
  136.         mb = VESAgetModeInfo(mode);
  137.         if (mb != NULL && (mb->ModeAttributes & MODE_EXTINFO) &&
  138.             mb->BitsPerPixel == 32) {
  139.           have_32_bit = 1; table->number_of_colors = 0xc020U;
  140.         }
  141.       }
  142.     }
  143. #if 0    
  144.     if (have_32_bit) {
  145.       for (table = graphics_mode_table + VESA_GRAPHIC_START; table->width > 0;
  146.            ++table) {
  147.         if (table->number_of_colors == 0xc018U)
  148.           table->mode.vdr.BIOS_mode = UNSUP;
  149.       }
  150.     }
  151. #endif    
  152.   }
  153.   HDR->driver_flags = GRD_VGA | GRD_NEW_DRIVER | GRD_NO_RW | GRD_4096K;
  154.   return (1);
  155. }
  156.  
  157. #include "pieces/textfont.c"
  158.  
  159.  
  160. int do_mode_set(GrModeEntry * md, int noclear, int *vw, int *vh, char *vflag)
  161. {
  162.   int BIOSno, memmode, pgmode;
  163.  
  164.   switch (md->mode.vdr.custom_setup_index) {
  165.     case SETUP_8X8_FNT:
  166.       return (mode_set_8x8_font(md, noclear));
  167.   }
  168.   if ((BIOSno = md->mode.vdr.BIOS_mode) > 0x13) {
  169.     if (noclear)
  170.       BIOSno |= 0x8000;
  171.     _AX = VESA_FUNC + VESA_SET_MODE;
  172.     _BX = BIOSno;
  173.     geninterrupt(0x10);
  174.     if (_AX != VESA_SUCCESS)
  175.       return (-1);
  176.   }
  177.   else {
  178.     if (noclear)
  179.       BIOSno |= 0x80;
  180.     _AX = BIOSno;
  181.     geninterrupt(0x10);
  182.   }
  183.   pgmode = setup_VESA_paging(md);
  184.   if (pgmode == (-1))
  185.     return (-1);
  186.   switch ((unsigned) md->number_of_colors) {
  187.     case 2U:
  188.       memmode = GRD_1_PLANE;
  189.       break;
  190.     case 16U:
  191.       memmode = GRD_4_PLANES;
  192.       break;
  193.     case 256U:
  194.       memmode = GRD_8_PLANES;
  195.       break;
  196.     case 32768U:
  197.       memmode = GRD_16_PLANES;
  198.       break;
  199.     case 0xc000U + 16:
  200.       memmode = GRD_16_R_PLANES;
  201.       break;
  202.     case 0xc000U + 24:
  203.       memmode = GRD_24_PLANES;
  204.       break;
  205.     default:
  206.       return (-1);
  207.   }
  208.  
  209. #if 0
  210.   if ((md->number_of_colors > 256) && (VESAversion >= VESA_VERSION(1, 2))) {
  211.     ModeInfoBlock *mb = VESAgetModeInfo(md->mode.vdr.BIOS_mode);
  212.     if (mb) {
  213.       HDR->r_mask = mb->RedMaskSize;
  214.       HDR->r_offs = mb->RedMaskPos;
  215.       HDR->g_mask = mb->GreenMaskSize;
  216.       HDR->g_offs = mb->GreenMaskPos;
  217.       HDR->b_mask = mb->BlueMaskSize;
  218.       HDR->b_offs = mb->BlueMaskPos;
  219.       HDR->f_mask = mb->ReservedMaskSize;
  220.       HDR->f_offs = mb->ReservedMaskPos;
  221.       /* is that 16 really only 15 ? */
  222.       if ((memmode == GRD_16_R_PLANES) && (HDR->f_mask > 0))
  223.          memmode = GRD_16_PLANES;
  224.     }
  225.   }
  226. #endif
  227.  
  228. #if 0
  229.   if ((*vw > md->width) || (*vh > md->height)) {
  230.     int virw = *vw;
  231.     int virh = *vh;
  232.     _BX = (virw > md->width) ? 0 : 1;    /* inquire only if width stays the same */
  233.     _CX = virw;
  234.     _AX = VESA_FUNC + VESA_SCAN_LNLEN;
  235.     geninterrupt(0x10);
  236.     if (_AX == VESA_SUCCESS) {
  237.       virw = _CX;
  238.       virh = _DX;
  239.       HDR->line_offset = _BX;
  240.       if ((virw > md->width) || (virh > md->height)) {
  241.          *vw = virw;
  242.          *vh = virh;
  243.          *vflag = 1;
  244.       }
  245.     }       
  246.   }
  247. #endif
  248.  
  249.   return ((HDR->driver_flags & ~(GRD_PLANE_MASK | GRD_PAGING_MASK)) | memmode | pgmode);
  250. }
  251.  
  252.  
  253. void do_screen_start_set(int *cp, int *rp)
  254. {
  255.   _CX = *cp;
  256.   _DX = *rp;
  257.   _BX = 0;
  258.   _AX = VESA_FUNC + VESA_DISP_START;
  259.   geninterrupt(0x10);
  260.   if (_AX == VESA_SUCCESS) {
  261.     *cp = _CX;
  262.     *rp = _DX;
  263.   }
  264. }
  265.  
  266. #include "pieces/vdrmain.c"
  267.